<?php
/*
 * 控制器的基类:所有控制器都要继承这一个类
 * 页面静态化技术
 * 最终生成的缓存文件都是以.html后缀结尾的!!
 */
header("Content-type: text/html; charset=utf-8");
class Controller{
    private $cache_path;            //静态化页面保存的位置    默认空  可以理解为根目录
    private $cache_lifetime;        //缓存的时间          默认300秒
    private $tmp_dir;               //调用模板的位置      默认是空
    private $params;                //传递参数  键值数组对
    /*
     * 构造函数   自动实例化smarty
     * */
    public function __construct(){
        $this->cache_path = $GLOBALS["ps"]["cache_path"];
        $this->cache_lifetime = $GLOBALS["ps"]["cache_lifetime"];
        $this->tmp_dir = __ROOT__."/".$GLOBALS["ps"]["appname"]."/view";
    }

    /*
     * 修改静态化页面保存的位置
     * 参数:
     * $cache_path 默认是空
     * */
    public function setCacheDir($cache_path=""){
        $this->cache_lifetime = $cache_path;
    }

    /*
     * 修改缓存的时间
     * 参数:
     * $cache_lifetime  默认 300秒  5分钟
     * */
    public function setCacheLifeTime($cache_lifetime=300){
        $this->cache_lifetime = $cache_lifetime;
    }

    /*
     * 修改调用模板的位置   (该函数一般不会执行)
     * 参数:
     * $tmp_dir   默认空
     * */
    public function setTmpDir($tmp_dir=""){
        $this->tmp_dir = $tmp_dir;
    }


    /*
    * 检查缓存文件是否存在
    * 参数:
    * $cache_tmp  静态化页面的名称   默认空  不用带.html后缀
    * $lifetime   默认是配置文件的时间
    * */
    public function is_cached($cache_tmp="",$lifetiem=""){
        $cache_tmp .= ".html";
        if(!isset($lifetiem) || empty($lifetiem) || !is_numeric($lifetiem)){
            $lifetiem = $this->cache_lifetime;
        }
        if(file_exists($this->cache_path."/".$cache_tmp) && time() - filemtime($this->cache_path."/".$cache_tmp) <= $lifetiem){
            unset($cache_tmp,$lifetiem);        //释放资源
            return true;        //仍然处于缓存时间
        }
        unset($cache_tmp,$lifetiem);        //释放资源
        return false;           //已经过期或者缓存文件不存在
    }

    /*
      * 调用模板 将模板缓存到指定位置
      * 参数:
      * $tmp   模板的名称  默认是空
      * $cache_name   静态化页面的名称  不用带.html 最终以.html后缀命名
      * */
    public function cache_page($tmp="",$cache_name=""){
        $tmp .= ".html";
        $cache_name .= ".html";
        $path_arr = explode("/", $cache_name);
        $path_len = count($path_arr);
        $path = "";
        for ($i = 0; $i < $path_len - 1; $i++) {          //支持多级目录
            $path .= $path_arr[$i];
            if ($i < $path_len - 2) {
                $path .= "/";
            }
        }
        unset($i);
        if(!file_exists($this->cache_path . "/" . $path)) {               //如果存在多级目录
            mkdir($this->cache_path . "/" . $path,0777,true);
        }
        ob_start();         //开始output缓冲区
        require_once $this->tmp_dir."/".$tmp;
        file_put_contents($this->cache_path."/".$cache_name,ob_get_contents());         //将页面进行静态化缓存
        unset($tmp,$cache_name,$path_arr,$path_len,$path,$php_errormsg);        //释放无用资源
        ob_clean();             //清空输出缓冲区的内容
    }

    /*
     * 展示文件  主要展示缓存文件
     * 参数:
     * $cache_name  静态化页面的名称 不用带.html
     * */
    public function display_cache($cache_name=""){
        require_once $this->cache_path."/".$cache_name.".html";
        unset($cache_name,$this);     //释放无用资源
    }

    /*
     * 向前端传递参数
     * 参数:
     * $name   前端使用时候的名称
     * $params  参数的内容
     * */
    public function assign($name="",$params=""){
        $this->params[$name] = $params;
    }

    /*
    * 展示文件  主要展示原模版文件
    * 参数:
    * $tpl_name  静态化页面的名称 不用带.html
    * */
    public function display($tpl_name=""){
        if(is_array($this->params)) {
            foreach ($this->params as $k => $v) {         //向前端传递数据
                $$k = $v;
            }
            require_once $this->tmp_dir . "/" . $tpl_name . ".html";
            foreach ($this->params as $k => $v) {         //释放无用资源
                unset($$k);
            }
            unset($tpl_name,$this,$k,$v);     //释放无用资源
        } else{
            require_once $this->tmp_dir . "/" . $tpl_name . ".html";
            unset($tpl_name,$this);
        }
    }

    /*
     * 重定向
     * $url     如果地址没有http://也没https://的话  默认是跳转到本地的链接  控制器/方法?参数  例子:Index/index
     *          如果带有http://或https://的话表示是一个绝对的地址   可以跳转到其他域名,其他网站  例如百度  http://www.baidu.com/
     * */
    protected function redirect($url=""){
        if(strpos($url,"http://") === false && strpos($url,"https://") === false) {           //检测是否是完成路径!如果不是就跳转到本地路径
            header("location: ". __APP__ . "/index.php/" . $url);
        }else{
            header("location: ". $url);
        }
        unset($url,$this);     //释放无用资源
        exit;
    }

    /*
     * ajax转码返回
     * $params 要处理的数据 默认null   数组形式
     * */
    public function ajaxReturn($params=null){
//        if(is_array($params)) {
//            foreach($params as $k => $v){
//                if(!is_array($v)) {
//                    $params[$k] = urlencode($v);
//                }
//            }
//        } else{
//           $params = urlencode($params);
//        }
        echo (json_encode($params));
        unset($params);     //释放无用资源
    }

    /*
     * 创建一个数据信息对象Message对象
     * 参数:
     * $errno       代码
     * $msg         信息
     * $data        附带数据
     * */
    public function message($errno=0,$msg="",$data=array()){
        $d["status"] = $errno;
        $d["message"] = $msg;
        $d["data"] = $data;
        return $d;
    }


    //析构函数
    public function __destruct(){}
}
